package com.atguigu.srb.core.controller.api;


import com.alibaba.fastjson.JSON;
import com.atguigu.srb.base.exception.Assert;
import com.atguigu.srb.base.result.R;
import com.atguigu.srb.base.result.ResponseEnum;
import com.atguigu.srb.base.utils.JwtUtils;
import com.atguigu.srb.core.enums.UserBindEnum;
import com.atguigu.srb.core.hfb.FormHelper;
import com.atguigu.srb.core.hfb.HfbConst;
import com.atguigu.srb.core.hfb.RequestHelper;
import com.atguigu.srb.core.pojo.entity.UserBind;
import com.atguigu.srb.core.pojo.entity.UserInfo;
import com.atguigu.srb.core.service.UserBindService;
import com.atguigu.srb.core.service.UserInfoService;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import io.swagger.annotations.ApiOperation;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * <p>
 * 用户绑定表 前端控制器
 * </p>
 *
 * @author Atguigu
 * @since 2023-01-04
 */
@RestController
@RequestMapping("/api/core/userBind")
public class ApiUserBindController {
    @Resource
    UserInfoService userInfoService;
    @Resource
    UserBindService userBindService;
    //回调接口:  http://192.168.1.170/api/core/userBind/notify
    @ApiOperation("hfb绑定后回调")
    @PostMapping("notify")
    public String notifyUrl(HttpServletRequest request){
        //1、获取hfb返回的绑定结果
        //获取请求路径后的请求参数字符串  url?k=v&k2=v2
        //get+请求参数 获取参数列表使用：request.getQueryString()  request.getParameterMap()
        //post+请求参数  获取参数列表使用：request.getParameterMap()
//        System.out.println(request.getParameterMap());
        Map<String, Object> map = RequestHelper.switchMap(request.getParameterMap());
        System.out.println(JSON.toJSONString(map));
        //2、判断是否绑定成功：
        //2.1 验证签名
        boolean signEquals = RequestHelper.isSignEquals(map);
        if(!signEquals){
            return "fail";
        }
        //2.2 hfb业务处理是否成功： resultCode 为0001时代表成功
        String resultCode = map.get("resultCode").toString();
        if(!"0001".equals(resultCode)){
            return "fail"; //返回失败
        }
        //3、判断如果绑定成功 将hfb的bindcode获取和绑定的会员数据 更新到数据库中
        String agentUserId = map.get("agentUserId").toString();//srb会员的id
        String bindCode = map.get("bindCode").toString();//hfb账户id
        //userBind: 保存用户绑定的数据
        UserBind userBind = userBindService.getOne(Wrappers.lambdaQuery(UserBind.class)
                .eq(UserBind::getUserId, agentUserId));
        userBindService.update(Wrappers.lambdaUpdate(UserBind.class)
                .eq(UserBind::getUserId ,agentUserId )
                .set(UserBind::getBindCode , bindCode)
                .set(UserBind::getStatus , UserBindEnum.BIND_OK.getStatus()));

        //userInfo：更新绑定状态和bindCode
        userInfoService.update(Wrappers.lambdaUpdate(UserInfo.class)
            .eq(UserInfo::getId , agentUserId)
            .set(UserInfo::getBindStatus , UserBindEnum.BIND_OK.getStatus())
            .set(UserInfo::getBindCode , bindCode)
            .set(UserInfo::getName , userBind.getName())
            .set(UserInfo::getIdCard , userBind.getIdCard()));

//        System.out.println("回调接口被访问了....");
        //hfb希望返回success代表业务执行成功
        return "success";
    }
///api/core/userBind/auth/hfbbind   /api/core/userBind
    @ApiOperation("账户绑定")
    @PostMapping("auth/hfbbind")
    public R hfbBind(@RequestBody UserBind userBind , @RequestHeader("token")String token){
        Long userId = JwtUtils.getUserId(token);
        //判断用户是否已绑定过hfb账户
        int count = userBindService.count(Wrappers.lambdaQuery(UserBind.class)
                .eq(UserBind::getIdCard, userBind.getIdCard())
                .eq(UserBind::getStatus, UserBindEnum.BIND_OK.getStatus()));
        Assert.assertTrue(count>0 , ResponseEnum.USER_BIND_IDCARD_EXIST_ERROR);
        //调用工具类将参数封装为自动提交的表单字符串响应
        Map<String, Object> map = new HashMap<>();
        map.put("agentId", HfbConst.AGENT_ID); //商户在hfb的唯一id  使用工具类中提供的
        map.put("agentUserId",userId); //要开通账户的会员id
        map.put("idCard",userBind.getIdCard());
        map.put("personalName",userBind.getName()); //身份证姓名
        map.put("bankType",userBind.getBankType());
        map.put("bankNo",userBind.getBankNo());
        map.put("mobile",userBind.getMobile());
//        map.put("returnUrl","http://localhost:3000/user"); // 会员在hfb绑定后，点击hfb中的超链接时 返回srb-site页面的 页面链接
        map.put("returnUrl",HfbConst.USERBIND_RETURN_URL); // 会员在hfb绑定后，点击hfb中的超链接时 返回srb-site页面的 页面链接
//        map.put("notifyUrl","http://192.168.1.170/api/core/userBind/notify"); // 会员在hfb绑定后，hfb发送绑定数据 访问的service-core 的回调接口
        map.put("notifyUrl",HfbConst.USERBIND_NOTIFY_URL); // 会员在hfb绑定后，hfb发送绑定数据 访问的service-core 的回调接口
        map.put("timestamp",System.currentTimeMillis());
        String sign = RequestHelper.getSign(map);
        map.put("sign",sign); //防止数据被篡改 对数据加密生成的签名
        //参数1： url代表hfb的开通账户的接口地址
        //参数2： 要提交给hfb开通账户的参数
        String form = FormHelper.buildForm(HfbConst.USERBIND_URL, map);
        //保存用户绑定账户的数据
        userBind.setUserId(userId); //一个绑定数据 代表会员绑定一个hfb账户
        userBind.setStatus(UserBindEnum.NO_BIND.getStatus());
        userBindService.save(userBind);
        return R.ok().data("form" , form);
    }

}

